package Server;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import Controlador.CPR;
import Controlador.Odv;
import Negocio.Cliente;
import Negocio.CondicionesPago;
import Negocio.Cotizacion;
import Negocio.Rodamiento;
import VO.ClienteVO;
import VO.CondicionesPagoVO;
import VO.CotizacionVO;
import VO.FacturaVO;
import VO.ItemListaPreciosVO;
import VO.ListaPreciosCPRVO;
import VO.ListaPreciosVO;
import VO.MovimientoStockVO;
import VO.ProveedorVO;
import VO.RodamientoVO;
import VO.SolicitudCompraCPRVO;
import VO.SolicitudRodamientosVO;
import rmi.ICPRRemote;
import rmi.IODVRemote;

public class CPRRemoteImp extends UnicastRemoteObject implements ICPRRemote,IODVRemote {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7111868289841136991L;
	private CPR cpr;
	private Odv odv;
	private static CPRRemoteImp instance;
	
	public static CPRRemoteImp getInstance() throws RemoteException 
	{
		if(instance==null)
		{
			instance=new CPRRemoteImp();
		}
		return instance;
	}
	private CPRRemoteImp() throws RemoteException{
		cpr = new CPR();
		odv = new Odv();
	}

	@Override
	public void conectivityTest() throws RemoteException {
		// TODO Auto-generated method stub
		System.out.println("Conexion establecida desde cliente");
	}

	@Override
	public ClienteVO obtenerCliente(String cuit) throws RemoteException {
		// TODO Auto-generated method stub
//		CondicionesPagoVO cp = new CondicionesPagoVO( "condicion1", 10, (float)0.1);
		ClienteVO c=new ClienteVO(1,"27202443","Pablo S" , "Balcarce 50","0600-1111",new Date(),true);
		return c; 
	}

	@Override
	public List<RodamientoVO> obtenerRodamientos() throws RemoteException {
		// TODO Auto-generated method stub
		return cpr.obtenerRodamientos();
	}

	@Override
	public int cargarSolicitudRodamientos(String xml) throws RemoteException {
		return odv.cargarSolicitudRodamientos(xml);

	}
	@Override
	public void altaRodamiento(RodamientoVO rod) throws RemoteException {
		System.out.println("creando rodamiento");
		cpr.altaRodamiento(rod);
		
	}
	@Override
	public void actualizarStock(RodamientoVO rod, MovimientoStockVO mov)
			throws RemoteException {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void eliminarRodamiento(RodamientoVO rod) throws RemoteException {
		try {
			cpr.eliminarRodamiento(rod);
		} catch (Exception e) {
			System.err.println("Error al eliminar rodamiento");
			e.printStackTrace();
		}
		
	}

	@Override
	public RodamientoVO buscarRodamiento(RodamientoVO rod) throws RemoteException {
		Rodamiento r = cpr.buscarRodamiento(rod);
		if(r!=null)
		{
			return cpr.rodamientoToVO(r);
		}
		return null;
	}
	
	@Override
	public void buscarRodamiento(int codigo) throws RemoteException {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void altaProveedor(ProveedorVO prov) throws RemoteException {
		cpr.altaProveedor(prov);
		
	}
	@Override
	public ProveedorVO buscarProveedor(ProveedorVO prov) throws RemoteException {
		// TODO Auto-generated method stub
		return cpr.proveedorToVO(cpr.buscarProveedor(prov));
	}
	@Override
	public void bajaProveedor(ProveedorVO prov) throws RemoteException {
		cpr.bajaProveedor(prov);
		
	}
	@Override
	public void administrarListaProveedor() throws RemoteException {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void armarComparativaPrecios() throws RemoteException {
		// TODO Auto-generated method stub
		
	}
	@Override
	public float calcularPorcentajeGanancia(RodamientoVO rod, float porc)
			throws RemoteException {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public void altaItemListaPrecios(ProveedorVO prov, String tipolista,
			ItemListaPreciosVO item) throws RemoteException {
		// TODO Auto-generated method stub
		
	}
	@Override
	public ListaPreciosVO altaListaPrecios(ProveedorVO prov,
			ListaPreciosVO lista) throws RemoteException {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void altaListaPrecios(ProveedorVO prov, String xml)
			throws RemoteException {
			try {
				cpr.altaListaPrecios(prov,xml);
			} catch (Exception e) {
				e.printStackTrace();
			}
	}
	@Override
	public void modificarRodamiento(RodamientoVO rodamiento)
			throws RemoteException {
		Rodamiento r = cpr.buscarRodamiento(rodamiento);
		r.setDescripcion(rodamiento.getDescripcion());
		r.setMedida(rodamiento.getMedida());
		r.setModelo(rodamiento.getModelo());
		r.getStock().setPuntoReposicion(rodamiento.getStock().getPuntoRep());
		cpr.modificarRodamiento(r);
		
	}
	
	@Override
	public List<CondicionesPagoVO> getCondicionesPagoVO()
			throws RemoteException {
		
		return cpr.getCondicionesPago();
	}
	@Override
	public ListaPreciosCPRVO obtenerComparativaPrecios(String codigo,
			String marca, String pais) throws RemoteException {
		return cpr.obtenerComparativaPrecios(codigo, marca, pais);
	}
	@Override
	public void setPorcentajeGananciaCPR(Float porcentaje) {
		cpr.setPorcentajeGanancia(porcentaje);
		
	}
	@Override
	public Float getPorcentajeGananciaCPR() {
		return cpr.getPorcentajeDeGanancia();
	}
	
	////////////////////////////////
	/// ODV 
	////////////////////////////////
	@Override
	public ArrayList<ClienteVO> getClientes() throws RemoteException {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public ArrayList<FacturaVO> getFacturas() throws RemoteException {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public ArrayList<SolicitudRodamientosVO> getSolicitudesrodamientos()
			throws RemoteException {
		System.out.println("odv::getSolicitudRodaminetos - 1");
		return odv.getSolicitudesrodamientos();
	}
	@Override
	public ArrayList<CotizacionVO> getCoticaciones() throws RemoteException {
		// TODO Auto-generated method stub
		Iterator<Cotizacion> it =odv.getCoticaciones().iterator();
		ArrayList<CotizacionVO> ret = new ArrayList<CotizacionVO>();
		
		while(it.hasNext())
		{
			ret.add(odv.cotizacionToVO(it.next()));
		}
		return ret;
	}
	@Override
	public ArrayList<SolicitudRodamientosVO> getSolicitudesRodamientos()
			throws RemoteException {
		System.out.println("odv::getSolicitudRodaminetos - 2");
		return odv.getSolicitudesrodamientos();
	}
	@Override
	public void altacliente(ClienteVO cli) throws RemoteException {
		// TODO Auto-generated method stub
		
	}
	@Override
	public ClienteVO buscarcliente(String cuit) throws RemoteException {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public ClienteVO buscarcliente(int id) throws RemoteException {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void bajacliente(int id) throws RemoteException {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void modificarcliente(ClienteVO cli) throws RemoteException {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void generarsolicitudrodamientos(ClienteVO cli, String sr_xml)
			throws RemoteException {
		// TODO Auto-generated method stub
		
	}
	@Override
	public RodamientoVO buscarrodamiento(String codigo) throws RemoteException {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void aceptarCotizacion(CotizacionVO cot) throws RemoteException {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void facturar(SolicitudCompraCPRVO sc) throws RemoteException {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void conectivityTestODV() throws RemoteException {
		System.out.println("Test de conectividad desde cliente");
	}

}
